//
// Created by Jisam on 12/09/2024 5:22 PM.
// Solution of  P1434 [SHOI2002] 滑雪
// 2024-09-12 17:37:52　AC 100 记忆化搜索
//#pragma GCC optimize(3)
#include <bits/stdc++.h>

using namespace std;
#define coutn(x) cout << (x) << "\n"
#define endl "\n"
#define PSI pair<string,int>
#define PII pair<int,int>
#define PDI pair<double,int>
#define PDD pair<double,double>
#define VVI vector<vector<int>>
#define VI vector<int>
#define VS vector<string>
#define PQLI priority_queue<int, vector<int>, less<int>>
#define PQGI priority_queue<int, vector<int>, greater<int>>
#define code_by_jisam ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
typedef long long i64;
typedef unsigned u32;
typedef unsigned long long u64;
typedef __int128 i128;
int dx[] = {-1, 1, 0, 0, 1, 1, -1, -1,};
int dy[] = {0, 0, -1, 1, 1, -1, -1, 1,};
int n, m;

// 定义最大矩阵尺寸常量，用于后续数组的大小定义
const int MAXN = 110;
// h数组用于存储矩阵中每个位置的高度
int h[MAXN][MAXN];
// s数组用于存储从每个位置开始的最长递减路径长度
int s[MAXN][MAXN];

/**
 * 使用深度优先搜索算法来寻找从位置(x, y)开始的最长递减路径长度
 * @param x 当前位置的横坐标
 * @param y 当前位置的纵坐标
 * @return 返回从位置(x, y)开始的最长递减路径长度
 */
i64 dfs(int x, int y){
    // 如果已经计算过此位置的最长递减路径长度，则直接返回结果
    if(s[x][y]) return s[x][y];
    // 初始化当前位置的最长递减路径长度为1（至少包括自身）
    s[x][y] = 1;
    // 遍历所有可能的移动方向
    for(int i = 0; i < 4; i ++){
        // 计算移动后的坐标
        int tx = x + dx[i];
        int ty = y + dy[i];
        // 如果移动后的坐标有效且高度递减，则继续搜索
        if(tx >= 0 && ty >= 0 && tx < n && ty < m && h[x][y] > h[tx][ty]){
            // 递归调用dfs函数，探索更远的路径
            dfs(tx,ty);
            // 更新当前位置的最长递减路径长度
            s[x][y] = max(s[x][y],s[tx][ty] + 1);
        }
    }
    // 返回从当前位置开始的最长递减路径长度
    return s[x][y];
}

/**
 * 问题的解决方案函数
 */
void solution() {
    // 输入矩阵的尺寸n和查询的次数m
    cin >> n >> m;
    // 输入矩阵中每个位置的高度
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> h[i][j];
        }
    }
    // 初始化最长递减路径长度为0
    i64 ans = 0;
    // 遍历矩阵中的每个位置，寻找最长的递减路径
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            // 调用dfs函数，获取从当前位置开始的最长递减路径长度，并更新ans
            ans = max(ans,dfs(i,j));
        }
    }
    // 输出最长的递减路径长度
    cout << ans;
}

int main() {
    code_by_jisam;
    i64 T = 1;
//    cin >> T;
    while (T--) {
        solution();
    }
    return 0;
}